package traitement;

import javax.xml.bind.JAXBElement;
import javax.xml.namespace.QName;

import constructeurEleve.EvaluationEleve.ExercicesEleve.ExerciceEleve.QuestionsEleve.QuestionEleve.CorrectionEleve;
import constructeurEvaluation.Evaluation;
import constructeurEvaluation.Evaluation.Exercices;
import constructeurEvaluation.Evaluation.Exercices.Exercice;
import constructeurEvaluation.Evaluation.Exercices.Exercice.Questions;
import constructeurEvaluation.Evaluation.Exercices.Exercice.Questions.Question;
import constructeurEvaluation.Evaluation.Exercices.Exercice.Questions.Question.Correction;
import constructeurReponse.EvaluationReponse;
import constructeurReponse.EvaluationReponse.ExercicesReponse;
import constructeurReponse.EvaluationReponse.ExercicesReponse.ExerciceReponse;
import constructeurReponse.EvaluationReponse.ExercicesReponse.ExerciceReponse.QuestionsReponse;
import constructeurReponse.EvaluationReponse.ExercicesReponse.ExerciceReponse.QuestionsReponse.QuestionReponse;
import constructeurReponse.EvaluationReponse.ExercicesReponse.ExerciceReponse.QuestionsReponse.QuestionReponse.CorrectionReponse;

public class TraitementReponse
{
	public TraitementReponse(){}
	
	public EvaluationReponse produireDocDeReponse(Evaluation eval) throws CloneNotSupportedException{
		Evaluation evaluation = (Evaluation) eval.clone();
		EvaluationReponse evaluationReponse = new EvaluationReponse();
		
		evaluationReponse.setExercicesReponse(produireDocDeReponses(evaluation.getExercices()));
		
		return evaluationReponse;
	}
	
	/**
	 * Traitement des exercices
	 * @param exercices Tous les exercices de l'evaluation
	 * @return tous les exercices de l'�valuation avec seulement les r�ponses
	 */
	private ExercicesReponse produireDocDeReponses(Exercices exercices){
		ExercicesReponse exercicesReponse = new ExercicesReponse();
		
		for(int i = 0; i < exercices.getExercice().size(); i++){
			ExerciceReponse exerciceReponse = produireDocDeReponses(exercices.getExercice().get(i));
			exercicesReponse.getExerciceReponse().add(exerciceReponse);
		}		
				
		return exercicesReponse;
	}
	
	/**
	 * Traitement d'un exercice
	 * @param exercice Un exercices de l'�valuation
	 * @return l'exercice de l'�valuation avec seulement les r�ponses
	 */
	private ExerciceReponse produireDocDeReponses(Exercice exercice) {
		ExerciceReponse exerciceReponse = new ExerciceReponse();
		
		exerciceReponse.setQuestionsReponse(produireDocDeReponses(exercice.getQuestions()));
		
		return exerciceReponse;
	}

	/**
	 * Traitement des questions
	 * @param questions toutes les questions d'un exercices de l'�valuation
	 * @return toutes les questions d'un exercices de l'�valuation avec seulement les r�ponses
	 */
	private QuestionsReponse produireDocDeReponses(Questions questions) {
		QuestionsReponse questionsReponse = new QuestionsReponse();
		
		for(int i = 0; i < questions.getQuestion().size(); i++){
			QuestionReponse questionReponse = produireDocDeReponses(questions.getQuestion().get(i));
			questionsReponse.getQuestionReponse().add(questionReponse);
		}		
				
		return questionsReponse;
	}

	/**
	 * Traitement d'une question d'un exercice d'une �valuation
	 * @param question Une question d'un exercice d'une �valuation
	 * @return la question de l'exercice de l'�valuation avec seulement la r�ponse
	 */
	private QuestionReponse produireDocDeReponses(Question question) {
		QuestionReponse questionReponse = new QuestionReponse();
		
		questionReponse.setCorrectionReponse(produireDocDeReponse(question.getCorrection()));
		questionReponse.setMethodeReponse(question.getMethode());
		questionReponse.setType(question.getType());
		
		return questionReponse;
	}
	
	
		private CorrectionReponse produireDocDeReponse(Correction correction) {
			CorrectionReponse correctionReponse = new CorrectionReponse();
			
			for(int i = 0; i < correction.getContent().size(); i++){
				if(correction.getContent().get(i).getClass().equals(JAXBElement.class)){
					if(((JAXBElement) correction.getContent().get(i)).getName().getLocalPart().equals("enonce")){
						QName qn = new QName(null, "enonceReponse", "...");
						JAXBElement elem = new JAXBElement(qn, String.class, ((JAXBElement) correction.getContent().get(i)).getValue());
						correctionReponse.getContent().add(elem);
					}
					else if(((JAXBElement) correction.getContent().get(i)).getName().getLocalPart().equals("reponse")){
						QName qn = new QName(null, "reponseReponse", "...");
						JAXBElement elem = new JAXBElement(qn, String.class, ((JAXBElement) correction.getContent().get(i)).getValue());
						correctionReponse.getContent().add(elem);
					}
				}
				else{
					correctionReponse.getContent().add(correction.getContent().get(i));
				}
			}		
					
			return correctionReponse;
		}
}
